// Package _1_打印一个字符串的全部排列 main
// @Title _1_打印一个字符串的全部排列
// @Description
// @Author  == 琳琳也叫王木木 ==  2022-01-21 12:52
// @Create  2022-01-21 12:52
package main

import "fmt"

func main() {

	//res := permuteUnique([]int{1,2,3})
	////res := permute([]int{1,2,3})
	//fmt.Println(res)
	fullPermutation([]int{1, 2, 3})
}

func fullPermutation(s []int) {
	for i := 0; i < len(s); i++ {
		for j := i; j < len(s); j++ {
			for k := j; k < len(s); k++ {
				if i == j && i == k {
					continue
				}
				s[i], s[j] = s[j], s[i]
				fmt.Println(s)
				s[i], s[j] = s[j], s[i]
			}
		}
	}
}

//
//  permute
//  @Description:
//  @param nums：数组
//  @return [][]int：返回结果
//
func permute(nums []int) [][]int {
	arrNum := len(nums)
	var ans [][]int
	if arrNum == 0 {
		return ans
	}
	var dfs func(nums []int, level int)
	//  num[0~i] i之前的位置已经被固定
	//  nums[]  i之后的位置都可以来到i位置
	dfs = func(nums []int, level int) {
		if level == len(nums) {
			ans = append(ans, append([]int(nil), nums...))
			return
		}
		// 从i开始 往后的位置都能来到i位置
		for i := level; i < len(nums); i++ {
			nums[i], nums[level] = nums[level], nums[i]
			dfs(nums, level+1)
			nums[i], nums[level] = nums[level], nums[i]
		}
	}
	dfs(nums, 0)
	return ans
}

func permuteUnique(nums []int) [][]int {
	var ans [][]int
	arrLen := len(nums)
	if arrLen == 0 {
		return ans
	}
	var dfs func(nums []int, level int)
	dfs = func(nums []int, level int) {
		if level == arrLen {
			ans = append(ans, append([]int(nil), nums...))
			return
		}
		for i := level; i < arrLen; i++ {
			//if nums[i] == nums[level]{
			//	continue
			//}
			nums[i], nums[level] = nums[level], nums[i]
			dfs(nums, level+1)
			nums[i], nums[level] = nums[level], nums[i]
		}
	}
	dfs(nums, 0)

	return ans
}
